package com.example.hal.server;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import org.restlet.resource.ServerResource;

import com.example.hal.model.Domaine;
import com.example.hal.model.Offre;
import com.example.hal.model.OffreBDD;
import com.example.hal.model.Utilisateur;
import com.example.hal.model.Departement;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.FileServiceFactory;
import com.google.appengine.api.files.FileWriteChannel;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.appengine.api.images.ServingUrlOptions;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.ObjectifyService;

import static com.googlecode.objectify.ObjectifyService.ofy;

public class OffreController	extends ServerResource implements
	 OffreControllerInterface {
	static{

		 ObjectifyService.register(Offre.class);
		 ObjectifyService.register(Utilisateur.class);
		 ObjectifyService.register(Departement.class);
		 ObjectifyService.register(Domaine.class);
	}

	public OffreController() {
		// TODO Auto-generated constructor stub

	}
	
	public Offre convertirBDDtoOffre(OffreBDD oBDD)
	{
		Offre o=new Offre();
		o.setId(oBDD.getId());
		if(oBDD.getUtilisateur()!=null)
		{
			o.setUtilisateur(ofy().load().key(oBDD.getUtilisateur()).now());
		}
		if(oBDD.getDomaine()!=null)
		{
			o.setDomaine(ofy().load().key(oBDD.getDomaine()).now());
		}
		o.setTitre(oBDD.getTitre());
		o.setTexte(oBDD.getTexte());
		o.setImage(oBDD.getImage());
	//	o.setVilles( ofy().load().type(Departement.class).ancestor(oBDD.getUtilisateur()).list()); 
		o.setRayon(oBDD.getRayon());
		o.setStatut(oBDD.getStatut());
		o.setDateCreation(oBDD.getDateCreation());
		o.setLongitude(oBDD.getLongitude());
		o.setLatitude(oBDD.getLatitude());
		o.setModeLocalite(oBDD.getModeLocalite());
		
		return o;
	}
	
	public OffreBDD convertirOffretoBDD(Offre o)
	{
		OffreBDD oBDD=new OffreBDD();
		oBDD.setId(o.getId());

	//	 Key<Utilisateur> utilisateurKey = new Key<Utilisateur>(Utilisateur.class, offre.getUtilisateur()..getId());
		if(o.getUtilisateur()!=null)
		{
			Key<Utilisateur> ku =Key.create(Utilisateur.class, o.getUtilisateur().getId());
			if(ku!=null){
		
				oBDD.setUtilisateur(ku);
			}
		}
		if(o.getDomaine()!=null)
		{
			/*Key<Domaine> kd =Key.create(Domaine.class, o.getDomaine().getId());
			if(kd!=null){
				oBDD.setDomaine(kd);
			}*/
		}

			/*List<Departement> villes=o.getVilles();
			List<Key<Departement>> keyvilles=new ArrayList<Key<Departement>>();
			for(Departement v : villes)
			{
				keyvilles.add(Key.create(Departement.class, v.getId()));
			}
			oBDD.setVilles( keyvilles); */
		
		oBDD.setTitre(o.getTitre());
		oBDD.setTexte(o.getTexte());
		oBDD.setImage(o.getImage());
		oBDD.setRayon(o.getRayon());
		oBDD.setStatut(o.getStatut());
		oBDD.setDateCreation(o.getDateCreation());
		oBDD.setLongitude(o.getLongitude());
		oBDD.setLatitude(o.getLatitude());
		oBDD.setModeLocalite(o.getModeLocalite());
		
		return oBDD;
	}
	
	@Override
	public void create(Offre offre) {
		// TODO Auto-generated method stub

	    
		 
		// OffreBDD tp = null;
	        Offre tp=null;
		 
		 if(offre.getId()!=null){
			// tp=ofy().load().type(OffreBDD.class).id(offre.getId()).now();
			 tp=ofy().load().type(Offre.class).id(offre.getId()).now();
			 
		 }
		 if(tp==null)
		 {

			// tp = new OffreBDD();
			 offre.setDateCreation(new Date());
		 }
		
		 
		 
		 if(offre.getImageByte()!=null && !offre.getImageByte().equals(""))
		 {
			 byte[] data = offre.getImageByte();
			  /**
			   *  MIME Type for
			   *  JPG use "image/jpeg" for PNG use "image/png"
			   *  PDF use "application/pdf"
			   *  see more: https://en.wikipedia.org/wiki/Internet_media_type
			   */
			  String mimeType = "image/png";

			  // save data to Google App Engine Blobstore 
			  FileService fileService = FileServiceFactory.getFileService();
			  AppEngineFile file;
			try {
				file = fileService.createNewBlobFile(mimeType,"o_"+offre.getId());
				  FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
				  writeChannel.write(java.nio.ByteBuffer.wrap(data));
				  writeChannel.closeFinally();
	
				  BlobKey blobKey = fileService.getBlobKey(file);
	
				  String imageUrl = ImagesServiceFactory.getImagesService().getServingUrl(ServingUrlOptions.Builder.withBlobKey(blobKey).secureUrl(true));
		  
				  if(offre.getIdBlobkey()!=null)
					 {
						 BlobKey blobKeytmp= new BlobKey(offre.getIdBlobkey());
						 final AppEngineFile f = fileService.getBlobFile(blobKeytmp);

					        if(f.isReadable())
					        {

					            if(f.hasFinalizedName())
					            {
					                fileService.delete(f); // Problematic line
					            }
					        }
						 
					 }
				  
				  offre.setImage(imageUrl);
				  offre.setIdBlobkey(blobKey.getKeyString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

				 //offre.setRetourHttp(3);
				// return offre;
			} 
			    
			    
			 
		 }
		/*
		 if(offre.getDepartements()!=null){
			 List<Departement> ld=new ArrayList<Departement>();
			 for(Departement d : offre.getDepartements())
			 {
				 
				 Departement departement = ofy().load().type(Departement.class).filter("CodePostal",d.getCodePostal()).first().now();
				 ld.add(departement);
			 }
			 offre.setDepartements(ld);
		 }
		 /*
		DepartementController dc=new DepartementController();
		UtilisateurFacebookController uc=new UtilisateurFacebookController();
		
		List<Departement> dl=new ArrayList<Departement>();
		Departement v;
		v=dc.getDepartement("51");
		dl.add(v);
		v=new Departement();
		v=dc.getDepartement("02");
		
		/*
		 tp.setImage(offre.getImage());

		// Key<Utilisateur> utilisateurKey = new Key<Utilisateur>(Utilisateur.class, offre.getUtilisateur()..getId());
		 //Utilisateur u = ofy().load().type(Utilisateur.class).id(offre.getUtilisateur().getId()).now();

		// Key<Utilisateur> ku=new Key<Utilisateur>(Utilisateur.class, offre.getUtilisateur().getId());
//Employee fred = ofy.get(bob.manager);
		// tp.setKeyUtilisateur(ku);
		 tp.setUtilisateur(offre.getUtilisateur());
		 tp.setDomaine(offre.getDomaine());
		 tp.setLatitude(offre.getLatitude());
		 tp.setLongitude(offre.getLongitude());
		 tp.setModeLocalite(offre.getModeLocalite());
		// tp.setPartout(tp.getPartout());
		 tp.setRayon(offre.getRayon());
		 tp.setStatut(offre.getStatut());
		 tp.setTexte(offre.getTexte());
		 tp.setTitre(offre.getTitre());
		 tp.setDepartements(offre.getDepartements());
		 */
		 //tp=convertirOffretoBDD(offre);

		 ofy().save().entity(offre).now(); 
		// ofy.put(tp);
	}
	@Override
	public OffreContainer getAllOffre() {
		// TODO Auto-generated method stub

	     Logger log = Logger.getLogger(OffreController.class.getName());

	        log.info("getAllOffre.");
	        log.severe("getAllOffre.");
		OffreContainer content = null;
		 List<Offre> offres = new ArrayList<Offre>();
		 
		 /*
		 List<OffreBDD> offresBDD = ofy().load().type(OffreBDD.class).list();
		 for (OffreBDD u : offresBDD)	
		 {
			Offre o=convertirBDDtoOffre(u);
			offres.add(o);
		 }
*/
		 offres = ofy().load().type(Offre.class).list();
		 
		 content = new OffreContainer();
		 content.setOffre_list(offres);
		 return content;
		 
	}

}
